home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
wb
/
czesc_1
/
deluxebeep
/
deluxebeep.s
< prev
next >
Wrap
Text File
|
1991-01-16
|
9KB
|
194 lines
*
* DeluxeBeep.s
*
* A stupid little gadget that play's a sample each time
* Intuition's "DisplayBeep" routine is called showing you
* the power of exec's "SetFunction" routine.
*
incdir sys:devpac_inc/
include exec/exec_lib.i
include exec/memory.i
include libraries/dos_lib.i
include intuition/intuition_lib.i
include hardware/custom.i
include hardware/intbits.i
include hardware/dmabits.i
_custom equ $dff000
*
* open intuition
*
move.l a0,a4 ; arg to a4
move.l d0,d3 ; arg_len to d3
move.l #int_name,a1 ; pointer to "intuition.library"
moveq #0,d0 ; any version (I don't care)
CALLEXEC OpenLibrary ; let's open it
move.l d0,_IntuitionBase ; and store the base pointer
beq NoLib ; what's this ? it failed to open
*
* check if the patch is already there, if so remove it
*
move.l d0,a2 ; IntuitionBase to a2
move.l _LVODisplayBeep+2(a2),a2 ; old routine address
cmp.l #'BEEP',-12(a2) ; Beep already installed ?
bne SetPatch ; no set it quickly !
move.l -8(a2),d0 ; old intuition beep routine
move.l _IntuitionBase,a1 ; IntuitionBase
move.l #_LVODisplayBeep,a0 ; table offset
CALLEXEC SetFunction ; normal again !
lea.l -12(a2),a1 ; pointer to the memory it takes
move.l -4(a2),d0 ; size of the memory it takes
CALLEXEC FreeMem ; and it's gone ! (phoe)
cmp.w #2,d3 ; one letter argument ?
bhi.s Remove ; no, more so remove
cmp.b #'F',(a4) ; arg 'F' ?
beq SetPatch ; yes, set new patch
cmp.b #'f',(a4) ; arg 'f' ?
beq SetPatch ; yes. set new patch
Remove: move.l #rem,a2 ; write a message saying that
move.l #rems,a3 ; DeluxeBeep has been removed
bsr PrintMsg ; from the system
bra NoMem
*
* reserve memory for the patch
*
SetPatch: move.l #patch_end-patch_start+12,d0 ; size of the patch
move.l #MEMF_CHIP+MEMF_CLEAR,d1 ; CHIP mem ! (sound data)
CALLEXEC AllocMem ; let's reserve it
move.l d0,Func ; and store the pointer
beq.s NoMem ; jeee wizzz it failed !
*
* get old vector
*
move.l _IntuitionBase,a0 ; IntuitionBase to a0
move.l _LVODisplayBeep+2(a0),OldVec+2 ; store the orig address
*
* copy the patch in the new memory
*
move.l #patch_start,a0 ; start of patch routine
move.l Func,a1 ; destenation area
move.l #'BEEP',(a1)+ ; so we known it's there already
move.l OldVec+2,(a1)+ ; so we known the old address
move.l #patch_end-patch_start,(a1)
move.l (a1),d0
add.l #12,(a1)+ ; so we know the size allocated
CALLEXEC CopyMem ; fire away !
*
* set the patch
*
move.l #_LVODisplayBeep,a0 ; table offset
move.l _IntuitionBase,a1 ; library base address
move.l Func,d0 ; new function
add.l #12,d0 ; add 12 bytes
CALLEXEC SetFunction ; and were in !
move.l #ins,a2 ; print a message saying
move.l #inss,a3 ; that DeluxeBeep is hanging
bsr PrintMsg ; in the system.
suba.l a0,a0 ; call it once to let them
CALLINT DisplayBeep ; hear it !
NoMem: move.l _IntuitionBase,a1 ; close intuition
CALLEXEC CloseLibrary ; like a good boy.
NoLib: moveq #0,d0 ; clear return code
rts ; and that's it !
*
* print a message
*
PrintMsg: move.l #dos_name,a1 ; pointer to "dos.library"
moveq #0,d0 ; any version (I still don't care)
CALLEXEC OpenLibrary ; open it now
move.l d0,_DOSBase ; and store the base pointer
beq.s NoDos ; failed, no message ?!?!
CALLDOS Output ; get output handle
move.l d0,d1 ; put it in d1
move.l a2,d2 ; message to d2
move.l a3,d3 ; size to d3
CALLDOS Write ; write it to the console
move.l _DOSBase,a1 ; and close dos again
CALLEXEC CloseLibrary ; yes close it now !
NoDos: rts ; bye bye
*
* the actual patch which plays the sample and call's
* the original "DisplayBeep" routine !
*
INTF_AUD equ INTF_AUD0!INTF_AUD1 ; only voice 0 and 1
DMAF_AUD equ DMAF_AUD0!DMAF_AUD1 ; same here
patch_start:
move.l a5,-(sp) ; save a5 on stack
lea.l _custom,a5 ; custombase in a5
move.w intenar(a5),-(sp) ; stack intenar
move.w #DMAF_AUD,dmacon(a5) ; audio off
move.w #dsize/2,aud0+ac_len(a5) ; num of samples voice 0
move.w #dsize/2,aud1+ac_len(a5) ; num of samples voice 1
move.l a0,-(sp) ; stack a0 (screen arg!)
lea.l data(pc),a0 ; pointer to sample data
move.l a0,aud0+ac_ptr(a5) ; data voice 0
move.l a0,aud1+ac_ptr(a5) ; data voice 1
move.w #40,aud0+ac_vol(a5) ; full volume voice 0
move.w #40,aud1+ac_vol(a5) ; full volume voice 1
move.w #sper,aud0+ac_per(a5) ; sample freq voice 0
move.w #sper,aud1+ac_per(a5) ; sample freq voice 1
move.w #INTF_AUD,intena(a5) ; disable audio interrupt
move.w #INTF_AUD,intreq(a5) ; " " "
move.w #DMAF_SETCLR!DMAF_MASTER!DMAF_AUD,dmacon(a5) ; audio on
wait: move.w intreqr(a5),d0 ; wait for audio interrupt
and.w #INTF_AUD,d0
cmp.w #INTF_AUD,d0
bne wait
move.w d0,intreq(a5) ; store audio bits in intreq
move.l (sp)+,a0 ; pull arguments (screen !)
OldVec: jsr $000000 ; Intuition's flash
lea _custom,a5 ; pointer to custom base
wait1: move.w intreqr(a5),d0 ; wait for audio dma done
and.w #INTF_AUD,d0
cmp.w #INTF_AUD,d0
bne wait1
move.w d0,intreq(a5) ; store audio bits in intreq
move.w #DMAF_AUD,dmacon(a5) ; audio off
move.w (sp)+,d0 ; pull intenar bits
and.w #INTF_AUD,d0 ; filter audio bits
or.w #INTF_SETCLR,d0 ; INTF_SETCLR
move.w d0,intena(a5) ; bits to intena
move.l (sp)+,a5 ; restore a5
rts ; done
data:
incbin 'Sample' ; here you can put the name
; of another RAW sample if
; you like.
patch_end: dc.w 0
sper equ 240 ; sample frequency. if it
; goes to fast or to slow
; change this.
*
* some global data's and definitions
*
dsize equ patch_end-data
dos_name: dc.b 'dos.library',0
even
int_name: dc.b 'intuition.library',0
even
ins: dc.b 10,'DeluxeBeep Installed !',10
dc.b 'Everytime a program call',39,'s intuition',39,'s',10
dc.b 'DisplayBeep routine you will hear this.',10,10
inse: even
inss equ inse-ins
rem: dc.b 10,'DeluxeBeep Removed !',10
dc.b 'Intuition',39,'s DisplayBeep routine',10
dc.b 'works normal again (sigh).',10,10
reme: even
rems equ reme-rem
_IntuitionBase: dc.l 0
_DOSBase: dc.l 0
Func: dc.l 0